
package com.jf.cloud.multishop.service;

import com.jf.cloud.api.multishop.bo.ShopWalletBO;
import com.jf.cloud.common.database.dto.PageDTO;
import com.jf.cloud.common.database.vo.PageVO;
import com.jf.cloud.multishop.bo.mongo.MongoShopWalletLogBO;
import com.jf.cloud.multishop.dto.ShopWalletLogSearchDTO;
import com.jf.cloud.multishop.vo.ShopWalletLogExcelVO;
import com.jf.cloud.multishop.vo.ShopWalletVO;
import com.jf.cloud.multishop.vo.mongo.MongoShopWalletLogVO;

import java.util.Date;
import java.util.List;

/**
 * 商家钱包记录
 *
 * @author zz
 * @date 2021-01-07 16:41:03
 */
public interface ShopWalletLogService {

    /**
     * 分页获取商家钱包记录列表
     * @param pageDTO 分页参数
     * @param shopWalletLogSearchDTO 钱包日志搜索参数
     * @return 商家钱包记录列表分页数据
     */
    PageVO<MongoShopWalletLogBO> pageByParam(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO);

    /**
     * 获取商家钱包总额
     * @param shopId 商家ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 商家钱包统计
     */
    MongoShopWalletLogVO listActualByHour(Long shopId, Date startTime, Date endTime);
    /**
     * 根据商家钱包记录id获取商家钱包记录
     *
     * @param walletLogId 商家钱包记录id
     * @return 商家钱包记录
     */
    MongoShopWalletLogBO getByWalletLogId(Long walletLogId);

    /**
     * 根据订单号查询店铺钱包日志
     * @param shopWalletLogSearchDTO
     * @return
     */
    List<MongoShopWalletLogBO> listByParam(ShopWalletLogSearchDTO shopWalletLogSearchDTO);

    /**
     * 保存钱包日志到MongoDB 注意事务
     * @param mongoShopWalletLogBO 日志
     * @return id
     */
    void saveMongo(MongoShopWalletLogBO mongoShopWalletLogBO);

    /**
     * 批量保存mongo日志 注意事务
     * 这里保存必须要有钱包日志的id，在前文代码必须传
     * @param list
     */
    void saveMongoBatch(List<MongoShopWalletLogBO> list);

    /**
     * 查询所有店铺的日志
     * @param pageDTO 分页
     * @param shopWalletLogSearchDTO 查询参数
     * @return 所有店铺的日志
     */
    PageVO<MongoShopWalletLogBO> pageAllShop(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO);

    /**
     * 获取导出列表
     * @param shopWalletLogSearchDTO
     * @return
     */
    List<ShopWalletLogExcelVO> listShopWalletLogExcel(ShopWalletLogSearchDTO shopWalletLogSearchDTO);

    /**
     * 分页查询某个店铺的充值余额记录
     * @param pageDTO 分页参数
     * @param shopId  店铺Id
     * @return
     */
    PageVO<MongoShopWalletLogBO> getRechargePageByShopId(PageDTO pageDTO, Long shopId);

    /**
     * 计算商家从订单获取金额的数量
     *
     * @param orderId                订单id
     * @param shopWalletChangeReason 钱包改变原因
     * @return 数量
     */
    long countInAmountByOrderId(Long orderId, Integer shopWalletChangeReason);


    /**
     * 计算商家从订单获取金额的数量
     *
     * @param orderIds               订单id列表
     * @param shopWalletChangeReason 钱包改变原因
     * @return 数量
     */
    Long countInAmountByOrderIds(List<Long> orderIds, Integer shopWalletChangeReason);

    /**
     * 计算商家从退款失去金额的数量
     *
     * @param refundId               退款编号
     * @param shopWalletChangeReason 钱包改变原因
     * @return 数量
     */
    long countOutAmountByRefundId(Long refundId, Integer shopWalletChangeReason);

    /**
     * 商家充值成功的更新
     * @param shopWalletLog
     * @param orderId
     */
    void updateRechargeSuccess(Long shopWalletLog, Long orderId);

    /**
     * 根据需要分片的数量获取店铺id列表
     * @param needZoneNum
     * @return
     */
    List<Long> listNeedZoneShopIds();

    /**
     * 根据时间和店铺名称获取店铺钱包信息
     * @param shopWalletLogSearchDTO
     * @return
     */
    ShopWalletVO getShopWalletByTime(ShopWalletLogSearchDTO shopWalletLogSearchDTO);

    ShopWalletBO getQrcodeShopWalletByTime(ShopWalletLogSearchDTO shopWalletLogSearchDTO);

    /**
     * 分页根据时间获取店铺钱包信息
     * @param pageDTO
     * @param shopWalletLogSearchDTO
     * @return
     */
    PageVO<ShopWalletVO> pageShopWalletByTime(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO);

    /**
     * 获取平台的钱包信息
     * @return
     */
    ShopWalletVO getPlatformWallet();

    /**
     * 计算商家从订单获取金额的数量
     *
     * @param orderIds               订单id列表
     * @param shopWalletChangeReason 钱包改变原因
     * @return 数量
     */
    List<MongoShopWalletLogBO> listByOrderIdsAndChangeReason(List<Long> orderIds, Integer shopWalletChangeReason);
}
